home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / 福袋 / 例題プログラム / SESCROLL.C < prev   
Text File  |  1993-12-31  |  8KB  |  232 lines

  1. /******************************************************************************
  2.  *    sescroll.c:    スクロール関係の関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1993 SHARP
  5.  */
  6. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  7. #include <control.h>        /* コントロールマンを利用するときに必要    */
  8. #include <text.h>        /* テキストマンを利用するときに必要    */
  9. #include "sedit.h"        /* このプログラム固有のヘッダファイル    */
  10.  
  11. /******************************************************************************
  12.  *    createScrollBar():    スクロールバーを作成する
  13.  ******************************************************************************
  14.  *    引数:    ComVal *pcv    共通変数へのポインタ
  15.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  16.  *                = FALSE: 作成失敗
  17.  */
  18. BOOLEAN createScrollBar(ComVal *pcv)
  19. {
  20.     Rect rcH, rcV;
  21.  
  22.     /* スクロールバーの位置を計算する */
  23.     pcv->scrlH.val = 0;
  24.     pcv->scrlH.max = 0;
  25.     pcv->scrlH.dMax = 0;
  26.  
  27.     pcv->scrlV.val = 0;
  28.     pcv->scrlV.max = 0;
  29.     pcv->scrlV.dMax = 0;
  30.  
  31.     /* スクロールバーの位置と大きさを計算する */
  32.     rcH = rcV = pcv->windowPtr->graph.rect;
  33.     rcH.d.top = rcH.d.bottom - SCRLBR_H;
  34.     rcH.d.right -= SCRLBR_H;
  35.     rcV.d.left = rcV.d.right - SCRLBR_H;
  36.     rcV.d.bottom -= SCRLBR_H;
  37.  
  38.     pcv->scrlBrHHdl = CMOpen(pcv->windowPtr, &rcH,
  39.         (_LASCII)"\0", TRUE, 0, 0, 0, CI_SCLBRWH << 4, 0);
  40.     if (pcv->scrlBrHHdl == NULL)
  41.         return FALSE;
  42.  
  43.     pcv->scrlBrVHdl = CMOpen(pcv->windowPtr, &rcV,
  44.         (_LASCII)"\0", TRUE, 0, 0, 0, CI_SCLBRWV << 4, 0);
  45.     if (pcv->scrlBrVHdl == NULL)
  46.         return FALSE;
  47.  
  48.     return TRUE;
  49. }
  50.  
  51. /******************************************************************************
  52.  *    checkScrollBar():    スクロールバーのパートごとの処理
  53.  ******************************************************************************
  54.  *    引数:    ComVal *pcv    共通変数へのポインタ
  55.  *    戻り値:    int        パートコード
  56.  */
  57. int checkScrollBar(ComVal *pcv)
  58. {
  59.     int partCode;            /* コントロールのパートコード    */
  60.     int sig = 1;            /* スクロールの方向(1 / -1)    */
  61.     long offset[2];
  62.     LPoint lpt;
  63.     Control **ctrlHdl;        /* コントロールハンドル        */
  64.  
  65.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  66.     /* テキストエディットをアップデートする */
  67.     TMUpDateExist(pcv->tEditHdl, 1);
  68.     /* 現在のオフセット値を取得する */
  69.     TMGetDestOffset(pcv->tEditHdl, offset);
  70.     /* ポインタ座標をローカル座標系に変換する */
  71.     lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
  72.     partCode = CMFind(lpt, pcv->windowPtr, &ctrlHdl);
  73.     switch(partCode) {
  74.     case C_INTHUMB:            /* スクロールボックス        */
  75.         CMCheck(ctrlHdl, lpt, NULL);
  76.         if (ctrlHdl == pcv->scrlBrHHdl)
  77.             offset[0] = CMValueGet(ctrlHdl);
  78.         else if (ctrlHdl == pcv->scrlBrVHdl)
  79.             offset[1] = CMValueGet(ctrlHdl) * (1 << pcv->scrlShift);
  80.         break;
  81.     case C_INUP:            /* スクロールアップボタン    */
  82.         sig = -1;
  83.         /* この処理は下に続きます */
  84.     case C_INDOWN:            /* スクロールダウンボタン    */
  85.         /* SHFTキーが押されてないか? */
  86.         if (!(pcv->event.ev.how & KS_SHIFT)) {
  87.             if (ctrlHdl == pcv->scrlBrHHdl) {
  88.                 /* 横8文字分スクロール */
  89.                 offset[0] += FONTSIZE * 8 * sig;
  90.                 if (offset[0] < 0)
  91.                     offset[0] = 0;
  92.                 else if (offset[0] >  CMMaxGet(ctrlHdl))
  93.                     offset[0] = CMMaxGet(ctrlHdl);
  94.             } else if (ctrlHdl == pcv->scrlBrVHdl)
  95.                 /* 縦3行分スクロール */
  96.                 offset[1] += (*pcv->tEditHdl)->lineHeight * 3 * sig;
  97.             break;
  98.         }
  99.         /* この処理は下に続きます */
  100.     case C_INPGUP:            /* ページスクロールアップボタン    */
  101.         if (partCode == C_INPGUP)
  102.             sig = -1;
  103.         /* この処理は下に続きます */
  104.     case C_INPGDOWN:        /* ページスクロールダウンボタン    */
  105.         if (ctrlHdl == pcv->scrlBrHHdl) {
  106.             /* 横表示桁数分スクロール */
  107.             offset[0] += ((*pcv->tEditHdl)->view.d.right
  108.                 - (*pcv->tEditHdl)->view.d.left) * sig;
  109.             if (offset[0] < 0)
  110.                 offset[0] = 0;
  111.             else if (offset[0] >  CMMaxGet(ctrlHdl))
  112.                 offset[0] = CMMaxGet(ctrlHdl);
  113.         } else if (ctrlHdl == pcv->scrlBrVHdl)
  114.             /* 縦表示行数分スクロール */
  115.             offset[1] += ((*pcv->tEditHdl)->view.d.bottom
  116.                 - (*pcv->tEditHdl)->view.d.top) * sig;
  117.         break;
  118.     default:
  119.         return 0;
  120.     }
  121.  
  122.     /* テキストエディットをスクロールさせる */
  123.     TMSetDestOffset(pcv->tEditHdl, offset[0], offset[1]);
  124.     setScrollBar(pcv);
  125.     return partCode;
  126. }
  127.  
  128. /******************************************************************************
  129.  *    setScrollBar():    スクロールバーに値を設定する
  130.  ******************************************************************************
  131.  *    引数:    ComVal *pcv    共通変数へのポインタ
  132.  */
  133. void setScrollBar(ComVal *pcv)
  134. {
  135.     ScrlVal svH, svV;
  136.  
  137.     /* スクロールバーの現在値、最大値を算出する */
  138.     calcScrollBar(pcv, &svH, &svV);
  139.  
  140.     if (svH.val != pcv->scrlH.val || svH.max != pcv->scrlH.max
  141.      || svH.dMax != pcv->scrlH.dMax) { /* 値に変更があるか?    */
  142.         /* コントロール定義関数のデータを設定する */
  143.         CMDefDataSet(pcv->scrlBrHHdl, LONGWORD(1, svH.dMax));
  144.         CMMaxSet(pcv->scrlBrHHdl, svH.max);
  145.         CMValueSet(pcv->scrlBrHHdl, svH.val);
  146.         pcv->scrlH = svH;
  147.     }
  148.  
  149.     if (svV.val != pcv->scrlV.val || svV.max != pcv->scrlV.max
  150.      || svV.dMax != pcv->scrlV.dMax) { /* 値に変更があるか?    */
  151.         /* コントロール定義関数のデータを設定する */
  152.         CMDefDataSet(pcv->scrlBrVHdl, LONGWORD(1, svV.dMax));
  153.         CMMaxSet(pcv->scrlBrVHdl, svV.max);
  154.         CMValueSet(pcv->scrlBrVHdl, svV.val);
  155.         pcv->scrlV = svV;
  156.     }
  157. }
  158.  
  159. /******************************************************************************
  160.  *    calcScrollBar():    スクロールバーの現在値、最大値の算出
  161.  ******************************************************************************
  162.  *    引数:    ComVal *pcv    共通変数へのポインタ
  163.  *        ScrlVal *pvalh    横スクロールバーの値を格納するポインタ
  164.  *        ScrlVal *pvalv    縦スクロールバーの        〃
  165.  */
  166. void calcScrollBar(ComVal *pcv, ScrlVal *pvalh, ScrlVal *pvalv)
  167. {
  168.     int edit, view, off, shift = 0;
  169.     TEdit *ptEdit = *pcv->tEditHdl;
  170.  
  171.     /* 縦方向のスクロール */
  172.     edit = ptEdit->nLines * ptEdit->lineHeight; /* 全体の行数    */
  173.     /* テキスト先頭から表示の最下位行までの行数 */
  174.     off = ptEdit->view.d.bottom - ptEdit->offsetV;
  175.     edit = (edit < off) ? off : edit; /* 全体行数を補正する        */
  176.     /* edit が 0x3f00 以下になるまで右シフトする */
  177.     while (edit > 0x3f00) {
  178.         edit >>= 1;
  179.         shift++;        /* シフト回数をカウントする    */
  180.     }
  181.     pvalv->dMax = edit;        /* コントロール定義関数のデータ    */
  182.     pcv->scrlShift = shift;
  183.     /* 最大値を計算する */
  184.     view = ptEdit->view.d.bottom - ptEdit->view.d.top;
  185.     view >>= shift;            /* edit と同じ回数右シフトする    */
  186.     pvalv->max = edit - view;
  187.     /* 現在値を計算する */
  188.     view = ptEdit->view.d.top - ptEdit->offsetV;
  189.     view >>= shift;            /* edit と同じ回数右シフトする    */
  190.     pvalv->val = view;
  191.  
  192.     /* 横方向のスクロール */
  193.     edit = ptEdit->dest.d.right - ptEdit->dest.d.left;
  194.     off = ptEdit->view.d.right - ptEdit->offsetH;
  195.     edit = (edit < off) ? off : edit; /* 全体行数を補正する        */
  196.     /* 全体桁数(コントロール定義関数で使用)*/
  197.     pvalh->dMax = edit;
  198.     /* 最大値を計算する */
  199.     view = ptEdit->view.d.right - ptEdit->dest.d.left;
  200.     pvalh->max = edit - view;
  201.     /* 現在値を計算する */
  202.     pvalh->val = ptEdit->dest.d.left - ptEdit->offsetH;
  203. }
  204.  
  205. /******************************************************************************
  206.  *    resizeScrollBar():    スクロールバーのサイズ変更
  207.  ******************************************************************************
  208.  *    引数:    ComVal *pcv    共通変数へのポインタ
  209.  */
  210. void resizeScrollBar(ComVal *pcv)
  211. {
  212.     Rect rcH, rcV;
  213.  
  214.     /* スクロールバーの位置と大きさを計算する */
  215.     rcH = rcV = pcv->windowPtr->graph.rect;
  216.     rcH.d.top = rcH.d.bottom - SCRLBR_H;
  217.     rcH.d.right -= SCRLBR_H;
  218.     rcV.d.left = rcV.d.right - SCRLBR_H;
  219.     rcV.d.bottom -= SCRLBR_H;
  220.  
  221.     CMHide(pcv->scrlBrHHdl);    /* スクロールバーを消去する    */
  222.     CMHide(pcv->scrlBrVHdl);
  223.  
  224.     CMMove(pcv->scrlBrHHdl, rcH.l.l_t);
  225.     CMSize(pcv->scrlBrHHdl, LONGWORD(rcH.d.right - rcH.d.left, SCRLBR_H));
  226.     CMMove(pcv->scrlBrVHdl, rcV.l.l_t);
  227.     CMSize(pcv->scrlBrVHdl, LONGWORD(SCRLBR_H, rcV.d.bottom - rcV.d.top));
  228.  
  229.     CMShow(pcv->scrlBrHHdl);    /* スクロールバーを表示する    */
  230.     CMShow(pcv->scrlBrVHdl);
  231. }
  232.